Esempio CNC 10: Programmazione di percorsi CNC dinamici
Vedi il CNC10_DynamicPath.project
progetto di esempio nella directory di installazione di CODESYS sotto ..\CODESYS SoftMotion\Examples
.
Questo esempio mostra come è possibile creare un percorso CNC direttamente nell'applicazione in fase di runtime, non alimentato con codice G da un oggetto programma CNC o da un file. Quando viene compilato questo tipo di programma CNC convenzionale, i dati del percorso vengono memorizzati in un file SMC_CNC_Data
tipo di struttura dati. Questi dati interni vengono quindi compilati in specifiche strutture di dati globali a seconda della modalità di compilazione (SMC_CNC_REF o SMC_OutQueue).
In modalità traduzione SMC_CNC_REF i dati sono in una matrice di elementi di tipo SMC_GEOINFO
salvato. L'array è in genere collegato all'istanza del blocco funzione nel codice dell'applicazione SMC_NCDecoder
devolvere. In fase di esecuzione, i dati vengono qui decodificati e convertiti in una struttura dati globale di tipo SMC_OUTQUEUE
scarti. Quindi è possibile richiamare i blocchi di preelaborazione del percorso.
In modalità traduzione SMC_OutQueue volere diretto una struttura dati globale (SMC_OUTQUEUE
) viene generato, che nel codice dell'applicazione viene inviato all'interpolatore (istanza FB SMC_Interpolator
) è passato. Il blocco funzione SMC_NCDecoder
non è chiamato.
In modalità di compilazione FILE, i dati vengono archiviati in un file. I dati sono memorizzati come un array di elementi di tipo SMC_GEOINFO
e corrispondono ai dati che vengono generati in modalità di compilazione SMC_CNC_REF.
Invece di programmare il percorso CNC, è possibile programmare un codice applicativo che istanzia una struttura dati di tipo SMC_OUTQUEUE
in fase di esecuzione e ne assegna i valori. Si programma un percorso CNC che viene generato dinamicamente in runtime. È possibile passare la struttura dati ad altre istanze di blocchi funzione (ad esempio ai blocchi funzione di preelaborazione del percorso o al blocco funzione SMC_Interpolator
).
Programmazione
Suggerimento
Nella directory di installazione di CODESYS trova il progetto di esempio CNCDynamicPath
. Il progetto di esempio è stato rimosso dal progetto CNConline
sviluppato. Contiene invece del percorso programmato graficamente Example
il programma Path
. Crea dinamicamente una struttura dati con tipo SMC_OUTQUEUE
.
Dichiarare una struttura dati di tipo
SMC_OUTQUEUE
. La struttura dati contiene i dati del percorso CNC ed è popolata dinamicamente.Esempio:
QUEUE
Allocare memoria per il percorso con la quantità richiesta a
SMC_GEOINFO
elementi.Esempio:
BUF
Dichiarare una variabile di tipo
SMC_GEOINFO
con un primo passo.Esempio:
GEO
Un elemento dell'array di tipo di dati
SMC_GEOINFO
corrisponde a un elemento del percorso nel codice CNC. I seguenti passaggi devono essere eseguiti per ogni elemento al fine di aggiungere l'elemento alSMC_OUTQUEUE
:Ogni elemento dell'array ha una posizione iniziale che corrisponde alla posizione finale dell'elemento dell'array precedente.
Esempio:
GEO.piStartPos.dX := 0;
oGEO.piStartPos := GEO.piDestPos;
Determinare un tipo di movimento per ogni elemento dell'array.
Esempio:
GEO.iMoveType := CCLW;
oGEO.iMoveType := LIN;
Imposta i parametri del tipo di movimento. Questo non è richiesto per tutti i tipi di movimento.
Esempio: Per un arco (tipo di movimento: CCLW), è richiesta l'impostazione delle seguenti posizioni:
geoinfo_A[i].dP1 := 200; geoinfo_A[i].dP2 := 100; geoinfo_A[i].dP3 := 50; geoinfo_A[i].dT1 := 0; geoinfo_A[i].dT2 := 90;
Inserire il calcolo della posizione finale.
SMC_CalcEndPnt(ADR(GEO));
Inserisci il calcolo della lunghezza dell'oggetto.
SMC_CalcLengthGeo(ADR(GEO));
Salva l'oggetto in
QUEUE
:SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));
Quando il percorso è stato creato completamente, gli indicatori di fine devono essere impostati: QUEUE-bEndOfList = TRUE;
Suggerimento
Quindi, quando viene chiamato un blocco funzione di preelaborazione del percorso, è necessario impostare il bit di inizio o di fine per InternMark
.
Percorso CNC con due elementi di percorso
In questo esempio, gli array non sono definiti con le posizioni X/Y. Se questo dovesse essere un esempio con due elementi di percorso come descritto, allora questi array dovrebbero avere due elementi ciascuno.
Ad esempio, derivato dal progetto di esempio:
xp:ARRAY[1..2] OF REAL:= [100,50]; yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path VAR iState : INT; QUEUE : SMC_OUTQUEUE; BUF : ARRAY[0..49] OF SMC_GEOINFO; // Memory allocation GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0); // Initial path element n : INT := 0; QUEUE.nSize := SIZEOF(BUF); END_VAR CASE iState OF 0: QUEUE.pbyBuffer := ADR(BUF[0]); // Initialize QUEUE SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF)); iState := iState + 1; 1: // Fill QUEUE WHILE NOT QUEUE.bFull DO // When QUEUE is full, wait until it has been processed by the following FBs n := n + 1; GEO.iSourceLine_No := n; GEO.piStartPos := GEO.piDestPos; // Copying last destination GEO.iMoveType := LIN; // Generating linear movement GEO.iObjNo := GEO.iObjNo + 1; // Calculating number GEO.piDestPos.dX := xp[n]; // Generatint position GEO.piDestPos.dY := yp[n]; SMC_CalcLengthGeo(pg := ADR(GEO)); // Calculating length of object with the help of the standard function SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO)); // Appending object to QUEUE IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN // All target positions processed QUEUE.bEndOfList := TRUE; n := 0; iState := 2; EXIT; END_IF END_WHILE 2: //Done ; END_CASE CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // Preprocessing
Importante
Se la SMC_OUTQUEUE
la struttura dei dati è popolata con SMC_GEOINFO
data e l'elemento della struttura dei dati è stato impostato su bFULL = TRUE
, quindi sconsigliamo un ulteriore incarico di SMC_GEOINFO
dati. In questo caso, la creazione del percorso viene interrotta a runtime fino al primo elemento del SMC_OUTQUEUE
la struttura dei dati viene elaborata nell'interpolatore. Solo allora viene inserito un altro elemento.
Evitare questa interruzione allocando memoria sufficiente. Vedi variabile BUF
.
Importante
Se la struttura dei dati SMC_OUTQUEUE
viene ricaricato dopo la prima esecuzione, quindi l'interpolatore e tutti i blocchi funzione di preelaborazione (esempio: SMC_CheckVelocities
) devono essere riavviati con un fronte di salita a Execute
.